package com.yunhe.transfer.config;

import com.yunhe.common.constant.ShedLockConsts;
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.redis.jedis.JedisLockProvider;
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import redis.clients.jedis.JedisPool;

/**
 * 分布式定时调度配置（Redis-Jedis模式）
 * 
 * SchedulerLock 注解一共支持3个参数，分别是
 * name 用来标注一个定时服务的名字，被用于写入数据库作为区分不同服务的标识，如果有多个同名定时任务则同一时间点只有一个执行成功
 * lockAtMostFor 成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达，例如“PT14M”表示为14分钟
 * lockAtLeastFor 成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达，例如“PT14M”表示为14分钟
 * 通过设置lockAtMostFor，即使节点死亡，lockAtLeastFor 我们也确保释放了锁定；
 * 通过设置，我们确保在15分钟内不执行一次以上。
 * 请注意，这lockAtMostFor仅是执行任务的节点死亡的情况的安全网，因此将其设置为明显大于最大估计执行时间的时间。
 * 如果任务花费的时间超过lockAtMostFor，则可能会再次执行该任务，并且结果将是不可预测的（更多进程将持有该锁）
 * 默认独占锁时间设置为3秒
 *
 * @author liurognlei
 */
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT3S", defaultLockAtLeastFor = "PT3S")
public class ShedLockConfig {

    @Bean
    public LockProvider lockProvider(JedisPool jedisPool) {
        return new JedisLockProvider(jedisPool, ShedLockConsts.Environment.DataTransfer.value());
    }

}